// Interceptor.attach(
//     ObjC.classes['MPCryptoService']['- generateRandom:'].implementation,
//     {
//         onEnter(args) {
//             // console.log(`-[NSConcreteMutableData appendBytes:${args[2]} length:${args[3].toInt32()}]`);
//             // console.log(hexdump(args[2], {length: args[3].toInt32()}))
//
//
//         },
//         onLeave(ret){
//             let a = new ObjC.Object(ret);
//             console.log('generateRandom', a)
//             let nsstr = ObjC.classes.NSString;
//             let ocstr = nsstr.stringWithFormat_('1111111111111111');
//             ret.replace(ocstr);
//             console.log('generateRandom2', new ObjC.Object(ret))
//
//         }
//
//     }
// )



var base = Module.getBaseAddress('MTPotal')

// var sub_024A641C = base.add(0x024A641C);
// Interceptor.attach(sub_024A641C, {
//     onEnter(args) {
//         this.a1 = args[0]
//         this.a2 = args[1];
//         this.a6 = args[6];
//         this.a7 = args[7];
//         this.a8 = args[8]
//         // console.log('sub_024A641C', args[0], args[1], args[2], args[5])
//         console.log(`sub_024A641C key`,hexdump(args[1], {length: args[2].toInt32()}))
//         console.log(`sub_024A641C secData`,hexdump(args[3],{length: args[4].toInt32()}))
//         console.log('sub_024A641C a6', args[5])
//
//         // var tid = Process.getCurrentThreadId();
//         // this.tid = tid;
//         // Stalker.follow(tid, {
//         //     events: {
//         //         call: true, // CALL instructions: yes please
//         //         ret: false, // RET instructions
//         //         exec: false, // all instructions: not recommended as it's
//         //         block: false, // block executed: coarse execution trace
//         //         compile: false // block compiled: useful for coverage
//         //     },
//         //     transform: (iterator) => {
//         //         let instruction = iterator.next();
//         //         const startAddress = instruction.address;
//         //         var isAppCode = startAddress.compare(base.add(0x024A641C)) >= 0 && startAddress.compare(base.add(0x024A641C).add(10000)) === -1;
//         //         do {
//         //             if (isAppCode) {
//         //                 console.log(instruction.address.sub(base), instruction, '|', instruction.regsRead, '|', instruction.regsWritten);
//         //             }
//         //             iterator.keep();
//         //         } while ((instruction = iterator.next()) !== null);
//         //
//         //     }
//         // })
//     },
//     onLeave(retval) {
//         console.log('sub_024A641C retval', retval)
//         console.log('sub_024A641C key\n', hexdump(this.a6))
//         console.log('sub_024A641C body\n', hexdump(this.a7.readPointer()))
//         console.log('sub_024A641C postKey\n', hexdump(this.a8.readPointer(), {length: 33})) // key
//         console.log(this.a6, this.a6.readPointer())
//         // Stalker.unfollow(this.tid)
//     }
// })
let sub_24A6774 = base.add(0x22AC34C);
Interceptor.attach(sub_24A6774, {
    onEnter(args){
        this.a1 = args[0]
        this.a2 = args[1]
        this.a3 = args[2]
        this.a4 = args[3]
        this.a5 = args[4]
        this.a6 = args[5]
        this.a7 = args[6]
        this.a8 = args[7]
        this.a9 = args[8]
        console.log('sub_24A6774.in a1', hexdump(this.a1))
        console.log('sub_24A6774.in a2 key', hexdump(this.a2, {length: this.a3.toInt32()}))
        console.log('sub_24A6774.in a4', hexdump(args[3]))
        // console.log('sub_24A6774.in a5', hexdump(args[4]))
        // console.log('sub_24A6774.in a6', args[5])
        // console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
        // .map(DebugSymbol.fromAddress).join('\n') + '\n')
    },
    onLeave(ret){
        console.log('sub_24A6774.leave ret', ret)
        console.log('sub_24A6774.leave deKey', hexdump(this.a7.readPointer()))
        console.log('sub_24A6774.leave postKey', hexdump(this.a8.readPointer()))
        console.log('sub_24A6774.leave postKey', hexdump(this.a9.readPointer()))
        // console.log('sub_24A6774.leave data', this.a6)
    }
})
// let sub_EC6940 = base.add(0xEC6940);
// Interceptor.attach(sub_EC6940, {
//     onEnter(args){
//         this.a1 = args[0]
//         this.a2 = args[1]
//         this.a3 = args[2]
//         this.a4 = args[3];
//         this.a5 = args[4];
//         this.a6 = args[5];
//
//         console.log('sub_EC6940.in a1', hexdump(this.a1.readPointer()))
//         console.log('sub_EC6940.in a2', hexdump(this.a2.readPointer()))
//         console.log('sub_EC6940.in a3', this.a3)
//
//         if (!this.a3.equals(0)){
//             console.log('sub_EC6940.in a3',  hexdump(this.a3.readPointer()))
//             // MemoryAccessMonitor.enable({
//             //     base:this.a3,
//             //     size:16,
//             // }, {
//             //     onAccess: function (details) {
//             //         console.log('onAccess', details.operation, details.address.sub(base), details.from.sub(base), details.context);
//             //     }
//             // })
//         }
//         if (!this.a4.equals(0)){
//             console.log('sub_EC6940.in a4',  hexdump(this.a4.readPointer()))
//         }
//         if (!this.a5.equals(0)){
//             console.log('sub_EC6940.in a5',  hexdump(this.a5.readPointer()))
//         }
//         console.log('sub_EC6940.in ', this.a4, this.a5, this.a6);
//
//         console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
//         .map(DebugSymbol.fromAddress).join('\n') + '\n')
//     },
//     onLeave(ret){
//         console.log('sub_EC6940.leave ret', ret)
//         if (!this.a4.equals(0)){
//             console.log('sub_EC6940.leave a4',  hexdump(this.a4.readPointer()))
//         }
//         if (!this.a5.equals(0)){
//             console.log('sub_EC6940.leave a5',  hexdump(this.a5.readPointer()))
//         }
//     }
// })
//
// let sub_EC7E54 = base.add(0xEC7E54);
// Interceptor.attach(sub_EC7E54, {
//     onEnter(args){
//         this.a1 = args[0]
//         this.a2 = args[1]
//         this.a3 = args[2]
//         this.a4 = args[3]
//         this.a5 = args[4]
//
//         console.log('sub_EC7E54.in a1', hexdump(this.a1.readPointer()))
//         console.log('sub_EC7E54.in a2', hexdump(this.a2.readPointer()))
//         console.log('sub_EC7E54.in a3', this.a3, this.a4)
//         if (!this.a4.equals(0)){
//             console.log('sub_EC7E54.in a4',  hexdump(this.a4))
//         }
//         if (!this.a5.equals(0)){
//             console.log('sub_EC7E54.in a5', this.a5)
//         }
//         // console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
//         // .map(DebugSymbol.fromAddress).join('\n') + '\n')
//     },
//     onLeave(ret){
//         console.log('sub_EC7E54.leave ret', ret)
//         if (!this.a4.equals(0)){
//             console.log('sub_EC7E54.leave a4', hexdump(this.a4))
//         }
//         // console.log('sub_EC7E54.leave ret', hexdump(ret))
//     }
// })

// let sub_24A5878 = base.add(0x24A5878);
// Interceptor.attach(sub_24A5878, {
//     onEnter(args){
//         this.a1 = args[0]
//         console.log('sub_24A5878.in a1', hexdump(this.a1))
//         console.log('sub_24A5878.in a2', hexdump(args[1]))
//         console.log('sub_24A5878.in a3', args[2])
//         // console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
//         // .map(DebugSymbol.fromAddress).join('\n') + '\n')
//     },
//     onLeave(ret){
//         console.log('sub_24A5878.leave ret', ret)
//         console.log('sub_24A5878.leave a0', hexdump(this.a1.readPointer()))
//     }
// })

// let sub_E9B670 = base.add(0xE9B670);
// Interceptor.attach(sub_E9B670, {
//     onEnter(args){
//         this.a1 = args[0]
//         this.a2 = args[1]
//         this.a3 = args[2]
//         console.log('sub_E9B670.in a1', hexdump(this.a1))
//         console.log('sub_E9B670.in a2',args[1])
//         if (!args[2].equals(0)){

//         console.log('sub_E9B670.in a3', hexdump(args[2]))
//         }
//         // console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
//         // .map(DebugSymbol.fromAddress).join('\n') + '\n')
//     },
//     onLeave(ret){
//         console.log('sub_E9B670.leave ret', hexdump(ret.readPointer()))
//         if (!this.a3.equals(0)){

//             console.log('sub_E9B670.leave a0', hexdump(this.a3))
//             console.log('sub_E9B670.leave a0', hexdump(this.a3.readPointer()))
//         }
//     }
// })

// let sub_0EC72C0 = base.add(0x0EC72C0);
// Interceptor.attach(sub_0EC72C0, {
//     onEnter(args){
//         this.a1 = args[0]
//         this.a3 = args[2]
//         // console.log('sub_0EC72C0.in a1', args[0].add(240))
//         // console.log('sub_0EC72C0.in a1', args[0].add(240).readPointer())
//         console.log('sub_0EC72C0.in a1', hexdump(this.a1))
//         console.log('sub_0EC72C0.in a2',hexdump(args[1].readPointer()))
//         if (!args[2].equals(0)){
//
//         console.log('sub_0EC72C0.in a3', hexdump(args[2].readPointer()))
//         }
//         console.log('sub_0EC72C0.in a4', args[3]);
//         console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
//         .map(DebugSymbol.fromAddress).join('\n') + '\n')
//     },
//     onLeave(ret){
//         if (!this.a3.equals(0)){
//
//             console.log('sub_0EC72C0.leave a0', hexdump(this.a3))
//             console.log('sub_0EC72C0.leave a0', hexdump(this.a3.readPointer()))
//         }
//         // console.log('sub_0EC72C0.leave a0', hexdump(this.a1.readPointer()))
//     }
// })
//
//
// var sub_1024A6C6C = base.add(0xD62BD4)
// Interceptor.attach(sub_1024A6C6C, {
//     onEnter(args) {
//         console.log('sub_1024A6C6C')
//         console.log('sub_1024A6C6C a1', hexdump(args[0]))
//         console.log('sub_1024A6C6C a2', hexdump(args[1]))
//         this.a1 = args[1];
//         console.log('sub_1024A6C6C a3', args[2])
//         console.log('sub_1024A6C6C a4', hexdump(args[3]))
//         console.log('sub_1024A6C6C a4', hexdump(args[3].readPointer()))
//         this.a3 = args[3];
//         console.log('sub_1024A6C6C a5', args[4])
//         this.a4 = args[4];
//
//     },
//     onLeave(ret) {
//         console.log('sub_1024A6C6C.leave', ret)
//         console.log('sub_1024A6C6C.leave postBody\n', hexdump(this.a4.readPointer()))
//     }
// })
//
//
// var addr1 = 0x24A53A8;
// Interceptor.attach(base.add(addr1), {
//     onEnter: function(args) {
//         var tid = Process.getCurrentThreadId();
//         this.tid = tid;
//         Stalker.follow(tid, {
//             events: {
//                 call: true, // CALL instructions: yes please
//                 ret: false, // RET instructions
//                 exec: false, // all instructions: not recommended as it's
//                 block: false, // block executed: coarse execution trace
//                 compile: false // block compiled: useful for coverage
//             },
//             transform: (iterator) => {
//                 let instruction = iterator.next();
//                 const startAddress = instruction.address;
//                 var isAppCode = startAddress.compare(base.add(addr1)) >= 0 && startAddress.compare(base.add(addr1).add(10000)) === -1;
//                 do {
//                     if (isAppCode) {
//                         console.log(instruction.address.sub(base), instruction, '|', instruction.regsRead, '|', instruction.regsWritten);
//
//                         if (instruction.address.sub(base).equals(0x24a53e8) ) {
//                             // console.log('regsRead',instruction.x9, instruction.x11)
//                             iterator.putCallout((ctx, data) => {
//                                 console.log('a1', hexdump(ctx.x0.readPointer()));
//                                 console.log('a2', hexdump(ctx.x1));
//                                 console.log('a3', hexdump(ctx.x2));
//
//                                 console.log('x8',ctx.x8);
//                             });
//                         }
//
//                         if (instruction.address.sub(base).equals(0x24a53f0) ) {
//                             // console.log('regsRead',instruction.x9, instruction.x11)
//                             iterator.putCallout((ctx, data) => {
//                                 console.log('0x24A53A8 q0', hexdump(ctx.q0));
//                                 console.log('0x24A53A8 q1', hexdump(ctx.q1));
//                                 console.log('s0', ctx.sp);
//
//                             });
//                         }
//                         if (instruction.address.sub(base).equals(0x24a53f4) ) {
//                             // console.log('regsRead',instruction.x9, instruction.x11)
//                             iterator.putCallout((ctx, data) => {
//                                 console.log('0x24A53A8 q0', hexdump(ctx.q0));
//                                 console.log('0x24A53A8 q1', hexdump(ctx.q1));
//
//                             });
//                         }
//                         if (instruction.address.sub(base).equals(0x24a53f8) ) {
//                             // console.log('regsRead',instruction.x9, instruction.x11)
//                             iterator.putCallout((ctx, data) => {
//                                 console.log('0x24A53A8 q0', hexdump(ctx.q0));
//                                 console.log('0x24A53A8 q1', hexdump(ctx.q1));
//
//                             });
//                         }
//
//                         // if (instruction.address.sub(base).equals(0x24a50ac) ) {
//                         //     // console.log('regsRead',instruction.x9, instruction.x11)
//                         //     iterator.putCallout((ctx, data) => {
//                         //             console.log("w8 = " + ctx.x8.sub(base))
//                         //             console.log('w0 = ', hexdump(ctx.x0));
//                         //             console.log('w1 = ', hexdump(ctx.x1));
//                         //             console.log('w2 = ', hexdump(ctx.x2));
//
//                         //     });
//                         // }
//                         // if (instruction!.mnemonic === "bl") {
//                         //
//                         // }
//                     }
//                     iterator.keep();
//                 } while ((instruction = iterator.next()) !== null);
//
//             }
//         })
//     }, onLeave: function(retval) {
//         Stalker.unfollow(this.tid);
//         Stalker.garbageCollect();
//         // console.log("retval:", new ObjC.Object(retval))
//         // console.log(addr.toString(16), "= loginWithPhoneNbr onLeave =");
//     }
// });
//
//
//
//
// var addr2 = 0x24A533C;
// Interceptor.attach(base.add(addr2), {
//     onEnter: function(args) {
//         var tid = Process.getCurrentThreadId();
//         this.tid = tid;
//         Stalker.follow(tid, {
//             events: {
//                 call: true, // CALL instructions: yes please
//                 ret: false, // RET instructions
//                 exec: false, // all instructions: not recommended as it's
//                 block: false, // block executed: coarse execution trace
//                 compile: false // block compiled: useful for coverage
//             },
//             transform: (iterator) => {
//                 let instruction = iterator.next();
//                 const startAddress = instruction.address;
//                 var isAppCode = startAddress.compare(base.add(addr2)) >= 0 && startAddress.compare(base.add(addr2).add(10000)) === -1;
//                 do {
//                     if (isAppCode) {
//                         // console.log(instruction.address.sub(base), instruction, '|', instruction.regsRead, '|', instruction.regsWritten);
//
//
//                         // if (instruction.address.sub(base).equals(0x24a5574) ) {
//                         //     iterator.putCallout((ctx, data) => {
//                         //         console.log('x8', hexdump(ctx.x8));
//
//
//                         //     });
//
//                         // }
//
//
//                         if (instruction.address.sub(base).equals(0x24a5368) ) {
//                             // console.log('regsRead',instruction.x9, instruction.x11)
//                             iterator.putCallout((ctx, data) => {
//                                 console.log('a1', hexdump(ctx.x0.readPointer()));
//                                 console.log('a2', hexdump(ctx.x1));
//                                 console.log('a3', hexdump(ctx.x2));
//
//                                 console.log('x8',ctx.sp);
//                                 console.log('x8',hexdump(ctx.sp));
//                             });
//                         }
//
//                         if (instruction.address.sub(base).equals(0x24a536c) ) {
//                             // console.log('regsRead',instruction.x9, instruction.x11)
//                             iterator.putCallout((ctx, data) => {
//                                 console.log('0x24a536c a1', ctx.x0);
//
//                             });
//                         }
//
//
//                         if (instruction.address.sub(base).equals(0x24a5370) ) {
//                             // console.log('regsRead',instruction.x9, instruction.x11)
//                             iterator.putCallout((ctx, data) => {
//                                 console.log('0x24A533C','q0', hexdump(ctx.q0));
//                                 console.log('0x24A533C','q1', hexdump(ctx.q1));
//                                 console.log('0x24A533C','s0', ctx.sp);
//
//                             });
//                         }
//                         if (instruction.address.sub(base).equals(0x24a5374) ) {
//                             // console.log('regsRead',instruction.x9, instruction.x11)
//                             iterator.putCallout((ctx, data) => {
//                                 console.log('0x24A533C','q0', hexdump(ctx.q0));
//                                 console.log('0x24A533C','q1', hexdump(ctx.q1));
//
//                             });
//                         }
//                         if (instruction.address.sub(base).equals(0x24a5378) ) {
//                             // console.log('regsRead',instruction.x9, instruction.x11)
//                             iterator.putCallout((ctx, data) => {
//                                 console.log('0x24A533C','q0', hexdump(ctx.q0));
//                                 console.log('0x24A533C','q1', hexdump(ctx.q1));
//
//                             });
//                         }
//
//                         // if (instruction.address.sub(base).equals(0x24a50ac) ) {
//                         //     // console.log('regsRead',instruction.x9, instruction.x11)
//                         //     iterator.putCallout((ctx, data) => {
//                         //             console.log("w8 = " + ctx.x8.sub(base))
//                         //             console.log('w0 = ', hexdump(ctx.x0));
//                         //             console.log('w1 = ', hexdump(ctx.x1));
//                         //             console.log('w2 = ', hexdump(ctx.x2));
//
//                         //     });
//                         // }
//                         // if (instruction!.mnemonic === "bl") {
//                         //
//                         // }
//                     }
//                     iterator.keep();
//                 } while ((instruction = iterator.next()) !== null);
//
//             }
//         })
//     }, onLeave: function(retval) {
//         Stalker.unfollow(this.tid);
//         Stalker.garbageCollect();
//         // console.log("retval:", new ObjC.Object(retval))
//         // console.log(addr.toString(16), "= loginWithPhoneNbr onLeave =");
//     }
// });
//
//
//
//
// var addr0x024A4E68 = 0x024A4E68;
// Interceptor.attach(base.add(addr0x024A4E68), {
//     onEnter: function(args) {
//         this.a1 = args[0];
//         this.a2 = args[1];
//         this.a3 = args[2];
//         console.log('sub_24A4E68 a1', hexdump(this.a1.readPointer()));
//         console.log('sub_24A4E68 a2', hexdump(this.a2));
//         console.log('sub_24A4E68 a3', this.a3);
//
//                console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
//         .map(DebugSymbol.fromAddress).join('\n') + '\n')
//         var tid = Process.getCurrentThreadId();
//         this.tid = tid;
//         Stalker.follow(tid, {
//             events: {
//                 call: true, // CALL instructions: yes please
//                 ret: false, // RET instructions
//                 exec: false, // all instructions: not recommended as it's
//                 block: false, // block executed: coarse execution trace
//                 compile: false // block compiled: useful for coverage
//             },
//             transform: (iterator) => {
//                 let instruction = iterator.next();
//                 const startAddress = instruction.address;
//                 var isAppCode = startAddress.compare(base.add(addr0x024A4E68)) >= 0 && startAddress.compare(base.add(addr0x024A4E68).add(10000)) === -1;
//                 do {
//                     if (isAppCode) {
//                         // console.log('0x024A4E68',instruction.address.sub(base), instruction, '|', instruction.regsRead, '|', instruction.regsWritten);
//
//
//                         // if (instruction.address.sub(base).equals(0x24a4ee4) ) {
//                         //     iterator.putCallout((ctx, data) => {
//                         //         console.log('x8', hexdump(ctx.x8));
//
//
//                         //     });
//
//                         // }
//                         if (instruction.address.sub(base).equals(0x24a4ee0) ) {
//                             // console.log('regsRead',instruction.x9, instruction.x11)
//                             iterator.putCallout((ctx, data) => {
//                                 console.log('0x24a4ee0 q0', hexdump(ctx.q0));
//                                 console.log('0x24a4ee0 q1', hexdump(ctx.q1));
//                                 console.log('s0', ctx.sp);
//
//                             });
//                         }
//                             if (instruction.address.sub(base).equals(0xf0cc50) ) {
//                             // console.log('regsRead',instruction.x9, instruction.x11)
//                             iterator.putCallout((ctx, data) => {
//                                 console.log('0x00F0CC50 q0', hexdump(ctx.x9));
//                                 console.log('0x00F0CC50 q1', hexdump(ctx.x11));
//
//                             });
//                         }
//                         if (instruction.address.sub(base).equals(0x24a4ee4) ) {
//                             // console.log('regsRead',instruction.x9, instruction.x11)
//                             iterator.putCallout((ctx, data) => {
//                                 console.log('0x24a4ee4 q0', hexdump(ctx.q0));
//                                 console.log('0x24a4ee4 q1', hexdump(ctx.q1));
//
//                             });
//                         }
//                         if (instruction.address.sub(base).equals(0x24a4ee8) ) {
//                             // console.log('regsRead',instruction.x9, instruction.x11)
//                             iterator.putCallout((ctx, data) => {
//                                 console.log('0x24a4ee8 q0', hexdump(ctx.q0));
//                                 console.log('0x24a4ee8 q1', hexdump(ctx.q1));
//
//                             });
//                         }
//
//                         // if (instruction.address.sub(base).equals(0x24a50ac) ) {
//                         //     // console.log('regsRead',instruction.x9, instruction.x11)
//                         //     iterator.putCallout((ctx, data) => {
//                         //             console.log("w8 = " + ctx.x8.sub(base))
//                         //             console.log('w0 = ', hexdump(ctx.x0));
//                         //             console.log('w1 = ', hexdump(ctx.x1));
//                         //             console.log('w2 = ', hexdump(ctx.x2));
//
//                         //     });
//                         // }
//                         // if (instruction!.mnemonic === "bl") {
//                         //
//                         // }
//                     }
//                     iterator.keep();
//                 } while ((instruction = iterator.next()) !== null);
//             }
//         })
//     }, onLeave: function(ret) {
//         Stalker.unfollow(this.tid);
//         Stalker.garbageCollect();
//         console.log('sub_24A4E68.leave', hexdump(ret ));
//         console.log('sub_24A4E68.leave', hexdump(this.a1 ));
//         console.log('sub_24A4E68.leave', hexdump(this.a1.readPointer() ));
//         // console.log("retval:", new ObjC.Object(retval))
//         // console.log(addr.toString(16), "= loginWithPhoneNbr onLeave =");
//     }
// });
//
//
//
//
// var addr0x24A504C = 0x24A504C;
// Interceptor.attach(base.add(addr0x24A504C), {
//     onEnter: function(args) {
//         var tid = Process.getCurrentThreadId();
//         this.tid = tid;
//         Stalker.follow(tid, {
//             events: {
//                 call: true, // CALL instructions: yes please
//                 ret: false, // RET instructions
//                 exec: false, // all instructions: not recommended as it's
//                 block: false, // block executed: coarse execution trace
//                 compile: false // block compiled: useful for coverage
//             },
//             transform: (iterator) => {
//                 let instruction = iterator.next();
//                 const startAddress = instruction.address;
//                 var isAppCode = startAddress.compare(base.add(addr0x24A504C)) >= 0 && startAddress.compare(base.add(addr0x24A504C).add(10000)) === -1;
//                 do {
//                     if (isAppCode) {
//                         // console.log(instruction.address.sub(base), instruction, '|', instruction.regsRead, '|', instruction.regsWritten);
//
//                         // if (instruction.address.sub(base).equals(0x24a507c) ) {
//                         //     // console.log('regsRead',instruction.x9, instruction.x11)
//                         //     iterator.putCallout((ctx, data) => {
//                         //             console.log('a2', hexdump(ctx.x20));
//                         //     });
//                         // }
//                         if (instruction.address.sub(base).equals(0x24a5084) ) {
//                             // console.log('regsRead',instruction.x9, instruction.x11)
//                             iterator.putCallout((ctx, data) => {
//                                 console.log("w9 = " + ctx.x9, '^', ctx.x11, '=',  ctx.x9.xor(ctx.x11))
//                             });
//                         }
//
//                         if (instruction.address.sub(base).equals(0x24a50ac) ) {
//                             // console.log('regsRead',instruction.x9, instruction.x11)
//                             iterator.putCallout((ctx, data) => {
//                                 console.log("w8 = " + ctx.x8.sub(base))
//                                 console.log('w0 = ', hexdump(ctx.x0));
//                                 console.log('w1 = ', hexdump(ctx.x1));
//                                 console.log('w2 = ', hexdump(ctx.x2));
//
//                             });
//                         }
//                         // if (instruction!.mnemonic === "bl") {
//                         //
//                         // }
//                     }
//                     iterator.keep();
//                 } while ((instruction = iterator.next()) !== null);
//             }
//         })
//     }, onLeave: function(retval) {
//         Stalker.unfollow(this.tid);
//         Stalker.garbageCollect();
//         // console.log("retval:", new ObjC.Object(retval))
//         // console.log(addr.toString(16), "= loginWithPhoneNbr onLeave =");
//     }
// });
//
// Interceptor.attach(base.add(0xF0CC20), {
//     onEnter: function(args) {
//         this.a1 = args[0];
//         this.a2 = args[1];
//         console.log('0x00F0CC20 a0', hexdump(args[0]))
//         console.log('0x00F0CC20 a1', hexdump(args[1]))
//         var tid = Process.getCurrentThreadId();
//         this.tid = tid;
//         Stalker.follow(tid, {
//             events: {
//                 call: true, // CALL instructions: yes please
//                 ret: false, // RET instructions
//                 exec: false, // all instructions: not recommended as it's
//                 block: false, // block executed: coarse execution trace
//                 // compile: true // block compiled: useful for coverage
//             },
//             transform: (iterator) => {
//                 let instruction = iterator.next();
//                 const startAddress = instruction.address;
//                 var isAppCode = startAddress.compare(base.add(0xF0CC20)) >= 0 && startAddress.compare(base.add(0xF0CC20).add(10000)) === -1;
//                 do {
//                     if (isAppCode) {
//                         console.log('0x00F0CC20',instruction.address.sub(base), instruction, '|', instruction.regsRead, '|', instruction.regsWritten);
//
//                         if (instruction.address.sub(base).equals(0xf0cc4c) ) {
//                             // console.log('regsRead',instruction.x9, instruction.x11)
//                             iterator.putCallout((ctx, data) => {
//                                 console.log('0x00F0CC50 w9', hexdump(ctx.x9));
//                                 console.log('0x00F0CC50 w11', hexdump(ctx.x11));
//
//                             });
//                         }
//                         if (instruction.address.sub(base).equals(0xf0cc50) ) {
//                             // console.log('regsRead',instruction.x9, instruction.x11)
//                             iterator.putCallout((ctx, data) => {
//                                 console.log('0x00F0CC50 q0', hexdump(ctx.q0));
//                                 console.log('0x00F0CC50 q1', hexdump(ctx.q1));
//
//                             });
//                         }
//                     }
//                     iterator.keep();
//                 } while ((instruction = iterator.next()) !== null);
//             }
//         })
//         // console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
//         // .map(DebugSymbol.fromAddress).join('\n') + '\n')
//     },
//     onLeave(ret){
//         console.log('0x00F0CC20 leave ?iv1', hexdump(this.a1));
//         console.log('0x00F0CC20 leave ?iv2', hexdump(this.a2));
//         Stalker.unfollow(this.tid);
//         Stalker.garbageCollect();
//
//     }
// })
// Interceptor.attach(base.add(0x0EE9254), {
//     onEnter: function(args) {
//         this.a2 = args[1];
//         console.log('0x0EE9254 a0', hexdump(args[0]))
//         console.log('0x0EE9254 a1', hexdump(args[1]))
//         // console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
//         // .map(DebugSymbol.fromAddress).join('\n') + '\n')
//     },
//     onLeave(ret){
//         // console.log('0xEEA844 leave ?iv1', hexdump(this.a2));
//
//     }
// })


// Interceptor.attach(
//     base.add(0xF0CD68),
//     {
//         onEnter(args){
//             this.a1 = args[0];
//             this.a2 = args[1];

//             console.log('0xF0CD68 enc enter ?iv1', hexdump(args[0]));
//             console.log('0xF0CD68 enc enter ?iv2', hexdump(args[1]));
//             console.log('0xF0CD68 enc enter ?iv3', hexdump(args[2]));
            
//         },
//         onLeave(ret){
//             console.log('0xF0CD68 enc leave ?iv1', hexdump(this.a1));
//             console.log('0xF0CD68 enc leave ?iv2', hexdump(this.a2));

//         }
//     }
// )

// Interceptor.attach(
//     base.add(0xF0D6E4),
//     {
//         onEnter(args){
//             this.a2 = args[1];
//             console.log('0xF0D6E4 enter ?iv', hexdump(args[0]));
//             console.log('0xF0D6E4 enter ?iv1', hexdump(args[1]));
//             console.log('0xF0D6E4 enter ?iv2', hexdump(args[2]));
//              console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
//         .map(DebugSymbol.fromAddress).join('\n') + '\n')
//         },
//         onLeave(ret){
//             console.log('0xF0D6E4 leave ?iv1', hexdump(this.a2));

//         }
//     }
// )

// Interceptor.attach(base.add(0x24A5540), {
//     onEnter: function(args) {
//         console.log('0x24A5540 a0', hexdump(args[0]))
//         console.log('0x24A5540 a1', hexdump(args[1]))
//         // console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
//         // .map(DebugSymbol.fromAddress).join('\n') + '\n')
//     }
// })

// Interceptor.attach(base.add(0xEDAF6C), {
//     onEnter: function(args) {
//         console.log('0xEDAF6C a0', args[5]);
        
//         console.log('0xEDAF6C a0', hexdump(args[0]))
//         console.log('0xEDAF6C a1', hexdump(args[1]))
//         // console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
//         // .map(DebugSymbol.fromAddress).join('\n') + '\n')
//     }
// })




// var addrEC679C = 0xEC6BA0;
// Interceptor.attach(base.add(addrEC679C), {
//     onEnter: function(args) {
//         var tid = Process.getCurrentThreadId();
//         this.tid = tid;
//         this.a1 = args[0];
//         this.a2 = args[1];
//         this.a3 = args[2];
//         this.a4 = args[3];
//         this.a5 = args[4];
//
//         console.log(hexdump(args[0]));
//         console.log(hexdump(args[0].readPointer()));
//         console.log(hexdump(args[1]));
//         console.log(hexdump(args[1].readPointer()));
//         console.log(hexdump(args[2]));
//         console.log('0xEC6BA0 2',hexdump(args[2].readPointer()));
//         if (!args[3].equals(0)){
//             console.log(3, hexdump(args[3]));
//         }
//         console.log('a4',hexdump(args[4]));
//         // Stalker.follow(tid, {
//         //     events: {
//         //         call: true, // CALL instructions: yes please
//         //         ret: false, // RET instructions
//         //         exec: false, // all instructions: not recommended as it's
//         //         block: false, // block executed: coarse execution trace
//         //         compile: false // block compiled: useful for coverage
//         //     },
//         //     transform: (iterator) => {
//         //         let instruction = iterator.next();
//         //         const startAddress = instruction.address;
//         //         var isAppCode = startAddress.compare(base.add(addrEC679C)) >= 0 && startAddress.compare(base.add(addrEC679C).add(10000)) === -1;
//         //         do {
//         //             if (isAppCode) {
//         //                 console.log(instruction.address.sub(base), instruction, '|', instruction.regsRead, '|', instruction.regsWritten);
//         //
//         //
//         //             }
//         //             iterator.keep();
//         //         } while ((instruction = iterator.next()) !== null);
//         //
//         //     }
//         // })
//
//         console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
//         .map(DebugSymbol.fromAddress).join('\n') + '\n')
//     }, onLeave: function(retval) {
//         // Stalker.unfollow(this.tid);
//         // Stalker.garbageCollect();
//         if (!this.a4.equals(0)){
//             console.log(3, hexdump(this.a4));
//         }
//         // console.log('0xEC6BA0.leave a4', hexdump(this.a4))
//         console.log('0xEC6BA0.leave a5', hexdump(this.a5))
//         console.log('0xEC6BA0.leave a5', hexdump(this.a5.readPointer()));
//         console.log('0xEC6BA0.leave a5', hexdump(this.a5.readPointer().readPointer()));
//         console.log("retval:",retval)
//         // console.log(addr.toString(16), "= loginWithPhoneNbr onLeave =");
//     }
// });
//
//
//
// Interceptor.attach(base.add(0xF0CAE8), {
//     onEnter: function(args) {
//         this.a1 = args[0];
//         this.a2 = args[1];
//         console.log('0x0F0A674 a1', hexdump(this.a1));
//         if (!this.a1.readPointer().equals(0)){
//             console.log('0x0F0A674 a1', hexdump(this.a1.readPointer()));
//         }
//         if (!this.a2.readPointer().equals(0)){
//             console.log('0x0F0A674 a2', hexdump(this.a2.readPointer()));
//         }
//         // console.log('0x0E9B554 a2', hexdump(this.a2.readPointer()));
//     },
//     onLeave: function(retval) {
//         if (!this.a1.readPointer().equals(0)){
//             console.log('0x0F0A674.leave a1', hexdump(this.a1.readPointer()));
//         }
//         if (!this.a2.readPointer().equals(0)){
//             console.log('0x0F0A674.leave a2', hexdump(this.a2.readPointer()));
//         }
//     }
// })
//
// // E9B150
// let sub_E9B150 = base.add(0xEC6080);
// Interceptor.attach(sub_E9B150, {
//     onEnter(args){
//         this.a1 = args[0];
//         console.log('EC6080.in a1', hexdump(this.a1));
//
//     }
// })
//
//
// Interceptor.attach(base.add(0xEDBE44), {
//     onEnter(args){
//         this.a1 = args[0];
//         console.log('0xEDBE44.in a1', this.a1);
//         console.log('0xEDBE44.in a4', hexdump(args[3]));
//
//
//     }
// })